#ifndef DATA_COLLECTION_ALLOCATION_H
#define DATA_COLLECTION_ALLOCATION_H

#include "ns3/object.h"
#include "channel-allocation.h"
#include <map>
#include <vector>
#include <string>

namespace ns3 {

/**
 * \ingroup sagin
 * \brief 数据收集分配算法
 * 
 * 该算法仅收集每个车辆在每个可能信道上的性能指标数据，
 * 不实际执行分配选择，只是输出所有可能性的数据
 */
class DataCollectionAllocation : public ChannelAllocation
{
public:
    /**
     * \brief Get the TypeId
     * \return The TypeId
     */
    static TypeId GetTypeId();
    
    DataCollectionAllocation();
    virtual ~DataCollectionAllocation();
    
    /**
     * \brief 设置数据输出目录
     * \param directory 输出目录路径
     */
    void SetOutputDirectory(std::string directory);
    
    // 实现纯虚函数
    virtual void LogAllocationResults() override;
    
protected:
    /**
     * 实现数据收集分配算法
     * \return 节点到信道的映射
     */
    virtual std::map<uint32_t, int> AllocateChannels() override;
    
private:
    /**
     * \brief 将收集到的数据保存为CSV格式
     */
    void SaveResults();
    
    std::string m_outputDir; // 数据输出目录
    
    // 存储每个车辆的数据记录
    struct DataRecord {
        uint32_t vehicleId;
        uint32_t channelId;
        double throughput;
        double delay;
        double interference;
        double pathLoss;
        double sinr;
        uint32_t connectedNodeId;
        std::string nodeType;
        double time;
        Vector position;
        double speed;
    };
    
    std::map<uint32_t, std::vector<DataRecord>> m_vehicleRecords;
};

} // namespace ns3

#endif /* DATA_COLLECTION_ALLOCATION_H */
